home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-0015 / flicker / frames.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  3KB  |  212 lines

  1.  
  2. #include "flicker.h"
  3.  
  4. extern long time_peek();
  5.  
  6. WORD screen_ix = 0;
  7. WORD screen_ct = 1;
  8. WORD *screens[MAX_SCREENS];
  9.  
  10. last_frame()
  11. {
  12. if (screen_ix > 0)
  13.     {
  14.     save_undo();
  15.     --screen_ix;
  16.     see_screen_ix();
  17.     }
  18. }
  19.  
  20. next_frame()
  21. {
  22. if (screen_ix < screen_ct - 1)
  23.     {
  24.     save_undo();
  25.     screen_ix++;
  26.     see_screen_ix();
  27.     }
  28. }
  29.  
  30. start_frame()
  31. {
  32. save_undo();
  33. screen_ix = 0;
  34. see_screen_ix();
  35. }
  36.  
  37. end_frame()
  38. {
  39. save_undo();
  40. screen_ix = screen_ct - 1;
  41. see_screen_ix();
  42. }
  43.  
  44. too_many_frames()
  45. {
  46. top_line("Too Many Frames");
  47. }
  48.  
  49. outta_memory()
  50. {
  51. top_line("Out of Memory");
  52. }
  53.  
  54.  
  55. mnext_frame()
  56. {
  57. register WORD **myframe;
  58. register WORD *frame;
  59.  
  60. if (screen_ct >= MAX_SCREENS)
  61.     {
  62.     too_many_frames();
  63.     return;
  64.     }
  65. if (mem_free < 32000 + 8000)
  66.     {
  67.     outta_memory();
  68.     return;
  69.     }
  70. if ((frame = alloc(32000)) == NULL)
  71.     {
  72.     outta_memory();
  73.     return;
  74.     }
  75. save_undo();
  76. myframe = screens+screen_ix+1;
  77. copy_pointers(myframe, myframe+1, screen_ct - screen_ix - 1);
  78. *myframe = frame;
  79. copy_screen(cscreen, frame);
  80. screen_ix++;
  81. screen_ct++;
  82. show_status();
  83. }
  84.  
  85. mlast_frame()
  86. {
  87. register WORD **myframe;
  88. register WORD *frame;
  89.  
  90. if (screen_ct >= MAX_SCREENS)
  91.     {
  92.     too_many_frames();
  93.     return;
  94.     }
  95. if (mem_free < 32000 + 8000)
  96.     {
  97.     outta_memory();
  98.     return;
  99.     }
  100. if ((frame = alloc(32000)) == NULL)
  101.     {
  102.     outta_memory();
  103.     return;
  104.     }
  105. save_undo();
  106. myframe = screens+screen_ix;
  107. copy_pointers(myframe, myframe+1, screen_ct - screen_ix);
  108. *myframe = frame;
  109. copy_screen(cscreen, frame);
  110. screen_ct++;
  111. show_status();
  112. }
  113.  
  114. delete_frame()
  115. {
  116. register WORD **myframe;
  117.  
  118. if (screen_ct == 1)
  119.     {
  120.     clear_pic();
  121.     }
  122. else
  123.     {
  124.     myframe = screens+screen_ix;
  125.     mfree(*myframe, 32000);
  126.     --screen_ct;
  127.     copy_pointers(myframe+1, myframe, screen_ct - screen_ix);
  128.     screens[screen_ct] = NULL;
  129.     if (screen_ix == screen_ct)
  130.         --screen_ix;
  131.     see_screen_ix();
  132.     }
  133. }
  134.  
  135. play_slowly()    /* 2 frames/sec */
  136. {
  137. playit(30, 1);
  138. }
  139.  
  140. play_forwards()    /* 6 frames/sec */
  141. {
  142. playit(10, 1);
  143. }
  144.  
  145. play_backwards() /* -6 frames/sec */
  146. {
  147. playit(10, -1);
  148. }
  149.  
  150. play_fast()        /* 15 frames/sec */
  151. {
  152. playit(4, 1);
  153. }
  154.  
  155. playit(ticks, dir)
  156. WORD ticks;
  157. WORD dir;
  158. {
  159. register long desttime;
  160.  
  161. save_undo();
  162. hide_mouse();
  163. desttime = get60hz() + ticks;
  164. for (;;)
  165.     {
  166.     screen_ix+=dir;
  167.     if (screen_ix >= screen_ct)
  168.         screen_ix = 0;
  169.     if (screen_ix < 0)
  170.         screen_ix = screen_ct-1;
  171.     if (zoom_flag)
  172.         {
  173.         zoom(screens[screen_ix], pscreen, zoomx, zoomy);
  174.         }
  175.     else
  176.         {
  177.         skip_beam();
  178.         copy_screen( screens[screen_ix], cscreen);
  179.         }
  180.     for (;;)
  181.         {
  182.         check_input();
  183.         if (EDN || key_hit)
  184.             goto nomore_play;
  185.         if (get60hz() >= desttime)
  186.             break;
  187.         }
  188.     desttime += ticks;
  189.     }
  190. nomore_play:
  191. show_mouse();
  192. see_screen_ix();
  193. }
  194.  
  195. wait_a_jiffy(jiff)
  196. WORD jiff;
  197. {
  198. register long desttime;
  199.  
  200. desttime = get60hz() + jiff;
  201. while ( get60hz() < desttime)
  202.     ;
  203. }
  204.  
  205.  
  206. long
  207. get60hz()
  208. {
  209. return( time_peek()*60/200);
  210. }
  211.  
  212.